home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 27 / CU Amiga Magazine's Super CD-ROM 27 (1998)(EMAP Images)(GB)[!][issue 1998-10].iso / CUCD / Programming / FreshBar / Source / SIFC_Strings.h < prev    next >
Encoding:
C/C++ Source or Header  |  1996-09-27  |  7.1 KB  |  191 lines

  1. //****************************************************************//
  2. // Filename:  StringC.h
  3. // Autor:     Christian Taulien of Strange Intelligence
  4. // Purpose:   Definition der StringC Klasse
  5. // Creation:  27. Mai 1997
  6. //****************************************************************//
  7. #ifndef TAULIEN_STRINGCLASS_HPP
  8. #define TAULIEN_STRINGCLASS_HPP
  9. #define RCSID_SIFC_STRINGS_H "$Id: SIFC_Strings.h 1.19 1998/04/16 03:29:43 Christian_Taulien Exp Christian_Taulien $"
  10.  
  11. //#include "SIFC.h"
  12. #include <stdarg.h>
  13. #include <string.h>
  14. #include <iostream.h>
  15.  
  16. #include <exec/types.h>
  17.  
  18. //*************************************************************************//
  19. //.klasse
  20. //KLASSENNAME   : StringC
  21. //VERSION       : 28. Februar 1998
  22. //AUTOR         : Taulien
  23. //AUFGABE       : Eine leistungsfähige String-Klasse
  24. //DOKUMENTATION : -
  25. //BEMERKUNGEN   : -
  26. //AENDERUNGEN   : -
  27. //28. Februar 1998: Neu: operator+= für nicht konstante Datentypen als
  28. //                  inline Methoden hinzugefügt.
  29. //*************************************************************************//
  30. class StringDataC
  31. {
  32. public:
  33.   char  *m_sStrPtr;
  34.   ULONG  m_ulStrLen;
  35.   ULONG  m_ulBufLen;
  36.   LONG   m_lRefs;
  37. };
  38.  
  39. class StringC
  40. {
  41. private:
  42.   // ## private Datamembers
  43.   StringDataC *m_poData;
  44.  
  45.   // Error-String index enumeration
  46.   enum {
  47.      str_AccessOutOfRange=0,
  48.      str_NoMemForAddition,
  49.      str_WriteAccessOnEmptyString,
  50.      str_IllegalZeroLength,
  51.      STRINGC_Last };
  52.  
  53.   static const char *m_asStringTable[STRINGC_Last];
  54.  
  55.   // ## private Methods ##
  56.   static const char *getStringTableEntry(ULONG arg_ulIndex);
  57.   StringC(ULONG arg_ulStrLen, ULONG arg_ulBufLen, char *arg_sStrPtr);
  58.  
  59.   BOOL isFilled();
  60.   BOOL isMultiUsed();
  61.   void incReference();
  62.   void decReference();
  63.   void prepareModify();
  64.  
  65. protected:
  66.   // ## protected methods ##
  67.   void initStringC(const char *arg_sStrPtr, ULONG arg_ulBufLen);
  68.   void initStringC(ULONG arg_ulBufLen);
  69.   void freeBuffer(void);
  70.   void resizeBuffer(ULONG arg_ulSize);
  71.   ULONG getBufferSize(void) const;
  72.  
  73. #ifdef si_debug
  74.   void dumpContext(void) const;
  75. #endif
  76.  
  77. public:
  78.   // ## public methods ##
  79.   enum { STRINGC_AccessLast = STRINGC_Last };
  80.   // Constructors and Destructor
  81.   StringC();
  82.   StringC(const char *arg_sStrPtr);
  83.   StringC(ULONG  arg_ulBufLen);
  84.   StringC(const char *arg_sStrPtr, ULONG arg_ulBufLen);
  85.   StringC(const StringC &arg_roSrcObj);
  86.   ~StringC();
  87.  
  88.   // common methods
  89.   BOOL isEmpty(void) const;
  90.   void emptyString(void);
  91.   void allocBuffer(ULONG arg_ulSize); // throw ObjectXC*;
  92.   ULONG getLength(void) const;
  93.   const char *getBuffer(void) const;
  94.   char getAt(ULONG arg_ulIndex, BOOL arg_fResizeIfNeccessary=FALSE);
  95.   char setAt(ULONG arg_ulIndex, char arg_cChar, BOOL arg_fResizeIfNeccessary=FALSE);
  96.   char *releaseBuffer(void);
  97.   void freeExtra(void);
  98.   void setString(const char *arg_sString);
  99.   LONG compareStringNoCase(StringC &arg_roCompObj);
  100.   LONG compareStringNoCase(char *arg_sCompStr);
  101.   LONG compareStringLimited(StringC &arg_roCompObj, ULONG arg_ulLength);
  102.   LONG compareStringLimited(char *arg_sCompStr, ULONG arg_ulLength);
  103.   LONG compareStringLimitedNoCase(StringC &arg_roCompObj, ULONG arg_ulLength);
  104.   LONG compareStringLimitedNoCase(char *arg_sCompStr, ULONG arg_ulLength);
  105.   StringC midString(ULONG arg_ulFirst, ULONG arg_ulCount) const;
  106.   StringC midString(ULONG arg_ulFirst) const;
  107.   StringC leftString(ULONG nCount) const;
  108.   StringC rightString(ULONG arg_ulCount) const;
  109.   LONG findChar(char arg_cSearchedChar) const;
  110.   LONG findCharNot(char arg_cSearchedChar) const;
  111.   LONG findCharReverse(char arg_cSearchedChar) const;
  112.   LONG findCharNotReverse(char arg_cSearchedChar) const;
  113.   LONG findString(const StringC &arg_roSearchedString) const;
  114.   LONG findString(char *arg_sSearchedString) const;
  115.   LONG findStringNoCase(const StringC &arg_roSearchedString) const;
  116.   LONG findStringNoCase(char *arg_sSearchedString) const;
  117.   LONG findOneOf(char *arg_sCharSet) const;
  118.   void makeLower(void);
  119.   void makeUpper(void);
  120.   void makeReverse(void);
  121.   void trimRight(void);
  122.   void trimLeft(void);
  123.   void trimString(void);
  124.   void formatString(char *arg_sFormat, ...);
  125.   void fillString(char arg_cFillByte);
  126.  
  127.   BOOL checkInstance(void) const;
  128.   void validateInstance(void);
  129.   void initInstance(void);
  130.   static void initStatic(StringC *arg_poString);
  131.  
  132.   // ## operator-Stuff ##
  133.   char operator[](int arg_iIndex);
  134.   operator char *() const;
  135.   operator const StringC &() { return (const StringC &) *this; };
  136.   StringC &operator=(const char *arg_sString);
  137.   StringC &operator=(const StringC &arg_roSrcObj);
  138.   StringC &operator += (const StringC &arg_roSummand);
  139.   StringC &operator += (StringC &arg_roSummand) { return operator+=((const StringC &) arg_roSummand); };
  140.   StringC &operator += (const char *arg_sSummand);
  141.   StringC &operator += (char *arg_sSummand)     { return operator+=((const char *) arg_sSummand); };
  142.   StringC &operator += (const char arg_cSummand);
  143.   StringC &operator += (char arg_cSummand)      { return operator+=((const char) arg_cSummand); };
  144.   friend StringC operator+(const StringC &arg_roFirst, const StringC &arg_roSecond);
  145.  
  146.   friend StringC operator+(const StringC &arg_roFirst, char arg_cSecond);
  147.   friend StringC operator+(char arg_cFirst, const StringC &arg_roSecond);
  148.  
  149.   friend StringC operator+(const StringC &arg_roFirst, const char *arg_sSecond);
  150.   friend StringC operator+(const char *arg_sFirst, const StringC& arg_roSecond);
  151. };
  152.  
  153. BOOL operator==(const StringC &arg_ro1, const StringC &arg_ro2);
  154. BOOL operator==(const StringC &arg_ro1, const char *s2);
  155. BOOL operator==(const StringC &arg_ro1, char *s2)
  156.                   { return operator==(arg_ro1, (const char *) s2); };
  157. BOOL operator==(const char *s1, const StringC &arg_ro2);
  158. BOOL operator==(char *s1, const StringC &arg_ro2)
  159.                   { return operator==((const char *) s1, arg_ro2); };
  160. BOOL operator!=(const StringC &arg_ro1, const StringC &arg_ro2);
  161. BOOL operator!=(const StringC &arg_ro1, const char *s2);
  162. BOOL operator!=(const char *s1, const StringC &arg_ro2);
  163. BOOL operator<(const StringC &arg_ro1, const StringC &arg_ro2);
  164. BOOL operator<(const StringC &arg_ro1, const char *s2);
  165. BOOL operator<(const char *s1, const StringC &arg_ro2);
  166. BOOL operator>(const StringC &arg_ro1, const StringC &arg_ro2);
  167. BOOL operator>(const StringC &arg_ro1, const char *s2);
  168. BOOL operator>(const char *s1, const StringC &arg_ro2);
  169. BOOL operator<=(const StringC &arg_ro1, const StringC &arg_ro2);
  170. BOOL operator<=(const StringC &arg_ro1, const char *s2);
  171. BOOL operator<=(const char *s1, const StringC &arg_ro2);
  172. BOOL operator>=(const StringC &arg_ro1, const StringC &arg_ro2);
  173. BOOL operator>=(const StringC &arg_ro1, const char *s2);
  174. BOOL operator>=(const char *s1, const StringC &arg_ro2);
  175.  
  176. inline ostream &operator << (ostream &arg_roCout, const StringC &arg_roSrcObj)
  177.   { arg_roCout << arg_roSrcObj.getBuffer(); return(arg_roCout); };
  178.  
  179. // StringC-Tags
  180. #define SIFCT_StringC_Index   SIFC_TAGBASE(StringC) + 1
  181. #define SIFCT_StringC_BufLen  SIFC_TAGBASE(StringC) + 2
  182. #define SIFCT_StringC_StrLen  SIFC_TAGBASE(StringC) + 3
  183.  
  184. // StringC-IDs
  185. #define SIFCID_StringC_ErrCode_AccessOutOfRange           SIFC_TAGBASE(StringC) + 1
  186. #define SIFCID_StringC_ErrCode_WriteAccessOnEmptyString   SIFC_TAGBASE(StringC) + 2
  187. #define SIFCID_StringC_ErrCode_ZeroLength                 SIFC_TAGBASE(StringC) + 3
  188.  
  189. #endif
  190.  
  191.